package cn.alusiaor.springbootsecurity.controller;


import cn.alusiaor.common.util.CloneUtil;
import cn.alusiaor.springbootsecurity.annotation.WebLog;
import cn.alusiaor.springbootsecurity.entity.User;
import cn.alusiaor.springbootsecurity.entity.UserInfoEntity;
import cn.alusiaor.springbootsecurity.entity.vo.UserInfoEntityVO;
import cn.alusiaor.springbootsecurity.service.UserInfoService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

/**
 * @author zhuzhiping
 * @date 2019/12/11
 * @description 功能描述
 */
@RestController
@Validated
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;


    /**
     * 根据ID获取用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:34
     * @Param userId  用户ID
     * @Return UserInfoEntity 用户实体
     */
    @WebLog(description = "根据ID获取用户信息")
    @RequestMapping("/getInfo")
    public UserInfoEntity getInfo(String userId) {
        UserInfoEntity userInfoEntity = userInfoService.getById(userId);
        return userInfoEntity;
    }

    /**
     * 查询全部信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:35
     * @Param userId  用户ID
     * @Return List<UserInfoEntity> 用户实体集合
     */
    @WebLog(description = "查询全部信息")
    @RequestMapping("/getList")
    public List<UserInfoEntityVO> getList() {

        List<UserInfoEntity> userInfoEntityList = userInfoService.list();


        List<User> userList = new ArrayList<>();

        User user1 = new User("id1", "name1", "phone1", "email1");
        User user2 = new User("id2", "name2", "phone2", "email2");
        User user3 = new User("id3", "name3", "phone3", "email3");

        userList.add(user1);
        userList.add(user3);
        userList.add(user2);

        List<UserInfoEntityVO> userInfoEntityVOList = CloneUtil.convert(userInfoEntityList, UserInfoEntityVO.class);

        userInfoEntityVOList.stream().forEach(userInfoEntity -> userInfoEntity.setUsers(userList));

        return userInfoEntityVOList;
    }

    /**
     * 分页查询全部数据
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:37
     * @Return IPage<UserInfoEntity> 分页数据
     */
    @WebLog(description = "分页查询全部数据")
    @RequestMapping("/getInfoListPage")
    public IPage<UserInfoEntity> getInfoListPage() {
        //需要在Config配置类中配置分页插件
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(5); //当前页
        page.setSize(1);    //每页条数
        page = userInfoService.page(page);
        return page;
    }

    /**
     * 根据指定字段查询用户信息集合
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:39
     * @Return Collection<UserInfoEntity> 用户实体集合
     */
    @WebLog(description = "根据指定字段查询用户信息集合")
    @RequestMapping("/getListMap")
    public Collection<UserInfoEntity> getListMap() {
        Map<String, Object> map = new HashMap<>();
        //kay是字段名 value是字段值
        map.put("age", 20);
        Collection<UserInfoEntity> userInfoEntityList = userInfoService.listByMap(map);
        return userInfoEntityList;
    }

    /**
     * 新增用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:40
     */

    @PostMapping("/saveInfo")
//    @WebLog(description = "批量新增用户信息")
    public String saveInfo(@Validated @RequestBody UserInfoEntity userInfoEntity) {
        userInfoService.save(userInfoEntity);
        return "新增用户信息";
    }

    /**
     * 批量新增用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:42
     */
    @WebLog(description = "批量新增用户信息")
    @RequestMapping("/saveInfoList")
    public void saveInfoList() throws Exception {
        //创建对象
        UserInfoEntity sans = new UserInfoEntity();
        sans.setName("Sans");
        sans.setSkill("睡觉");
        sans.setAge(18);
        sans.setFraction(60L);
        sans.setEvaluate("Sans是一个爱睡觉,并且身材较矮骨骼巨大的骷髅小胖子");
        UserInfoEntity papyrus = new UserInfoEntity();
        papyrus.setName("papyrus");
        papyrus.setSkill("JAVA");
        papyrus.setAge(18);
        papyrus.setFraction(58L);
        papyrus.setEvaluate("Papyrus是一个讲话大声、个性张扬的骷髅，给人自信、有魅力的骷髅小瘦子");
        //批量保存
        List<UserInfoEntity> list = new ArrayList<>();
        list.add(sans);
        list.add(papyrus);

        userInfoService.saveBatch(list);
        throw new Exception("测试");
    }

    /**
     * 更新用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:47
     */
    @WebLog(description = "更新用户信息")
    @RequestMapping("/updateInfo")
    public void updateInfo() {
        //根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(19);
        userInfoService.updateById(userInfoEntity);
    }

    /**
     * 新增或者更新用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:50
     */
    @WebLog(description = "新增或者更新用户信息")
    @RequestMapping("/saveOrUpdateInfo")
    public void saveOrUpdate() {
        //传入的实体类userInfoEntity中ID为null就会新增(ID自增)
        //实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增
        UserInfoEntity userInfoEntity = new UserInfoEntity();
        userInfoEntity.setId(1L);
        userInfoEntity.setAge(20);
        userInfoService.saveOrUpdate(userInfoEntity);
    }

    /**
     * 根据ID删除用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:52
     */
    @WebLog(description = "根据ID删除用户信息")
    @RequestMapping("/deleteInfo")
    public void deleteInfo(String userId) {
        userInfoService.removeById(userId);
    }

    /**
     * 根据ID批量删除用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:55
     */
    @WebLog(description = "根据ID批量删除用户信息")
    @RequestMapping("/deleteInfoList")
    public void deleteInfoList() {
        List<String> userIdlist = new ArrayList<>();
        userIdlist.add("12");
        userIdlist.add("13");
        userInfoService.removeByIds(userIdlist);
    }

    /**
     * 根据指定字段删除用户信息
     *
     * @Author Sans
     * @CreateTime 2019/6/8 16:57
     */
    @WebLog(description = "根据指定字段删除用户信息")
    @RequestMapping("/deleteInfoMap")
    public void deleteInfoMap() {
        //kay是字段名 value是字段值
        Map<String, Object> map = new HashMap<>();
        map.put("skill", "删除");
        map.put("fraction", 10L);
        userInfoService.removeByMap(map);
    }


    @WebLog(description = "执行数据库查询")
    @RequestMapping("/getInfoListSQL")
    public IPage<UserInfoEntity> getInfoListSQL() {
        //查询大于60分以上的学生,并且分页
        IPage<UserInfoEntity> page = new Page<>();
        page.setCurrent(1);
        page.setSize(5);
        page = userInfoService.selectUserInfoByGtFraction(page, 60L);
        return page;
    }
}
